package fr.dauphine.bookstore.modele;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Lob;
import javax.persistence.OneToMany;
import javax.persistence.Table;

/**
 * Utilisateur.
 */
@Entity
@Table(name = "BookstoreUser")
public final class User extends Persistent {

	/**
	 * Serial version UID.
	 */
	private static final long serialVersionUID = 6851403680163509252L;

	/**
	 * Taille max d'un avatar (en octets).
	 */
	public static final int PHOTO_MAX_SIZE = 100000;

	/**
	 * Prenom.
	 */
	private String firstName;

	/**
	 * Nom.
	 */
	private String lastName;

	/**
	 * Nom d'utilisateur.
	 */
	private String userName;

	/**
	 * Mot de passe.
	 */
	private String password;

	/**
	 * Adresse email.
	 */
	private String email;

	/**
	 * Administrateur (true = administrateur, false = non).
	 */
	private Boolean admin = Boolean.FALSE;

	/**
	 * Avatar.
	 */
	private byte[] avatar;

	/**
	 * Commandes.
	 */
	private List<Order> orders = new ArrayList<Order>();

	// Methodes Get&Set

	/**
	 * Retourne les commandes.
	 * 
	 * @return Commandes
	 */
	@OneToMany(mappedBy = "user")
	public List<Order> getOrders() {
		return orders;
	}

	/**
	 * Met a jour les commandes.
	 * 
	 * @param orders
	 *            Commandes
	 */
	public void setOrders(final List<Order> orders) {
		this.orders = orders;
	}

	/**
	 * Retourne le prenom.
	 * 
	 * @return Prenom
	 */
	public String getFirstName() {
		return firstName;
	}

	/**
	 * Met a jour le prenom.
	 * 
	 * @param firstName
	 *            Prenom
	 */
	public void setFirstName(final String firstName) {
		this.firstName = firstName;
	}

	/**
	 * Retourne le nom.
	 * 
	 * @return Nom
	 */
	public String getLastName() {
		return lastName;
	}

	/**
	 * Met a jour le nom.
	 * 
	 * @param lastName
	 *            Nom
	 */
	public void setLastName(final String lastName) {
		this.lastName = lastName;
	}

	/**
	 * Retourne le nom d'utilisateur.
	 * 
	 * @return Nom d'utilisateur
	 */
	@Column(unique = true)
	public String getUserName() {
		return userName;
	}

	/**
	 * Met a jour le nom d'utilisateur.
	 * 
	 * @param userName
	 *            Nom d'utilisateur
	 */
	public void setUserName(final String userName) {
		this.userName = userName;
	}

	/**
	 * Retourne le mot de passe.
	 * 
	 * @return Mot de passe
	 */
	public String getPassword() {
		return password;
	}

	/**
	 * Met a jour le mot de passe.
	 * 
	 * @param password
	 *            Mot de passe
	 */
	public void setPassword(final String password) {
		this.password = password;
	}

	/**
	 * Retourne l'email.
	 * 
	 * @return Email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * Met a jour l'email.
	 * 
	 * @param email
	 *            Email
	 */
	public void setEmail(final String email) {
		this.email = email;
	}

	/**
	 * Retourne le flag administrateur.
	 * 
	 * @return Flag administrateur
	 */
	public Boolean getAdmin() {
		return admin;
	}

	/**
	 * Met a jour le flag administrateur.
	 * 
	 * @param admin
	 *            Flag administrateur
	 */
	public void setAdmin(final Boolean admin) {
		this.admin = admin;
	}

	/**
	 * Retourne l'avatar.
	 * 
	 * @return Avatar
	 */
	@Lob
	@Column(length = PHOTO_MAX_SIZE)
	public byte[] getAvatar() {
		return avatar;
	}

	/**
	 * Met a jour l'avatar.
	 * 
	 * @param avatar
	 *            Avatar
	 */
	public void setAvatar(final byte[] avatar) {
		this.avatar = avatar;
	}

	// Surcharges

	/**
	 * @return Prenom et Nom
	 */
	public String toString() {
		return getFirstName() + " " + getLastName();
	}
	
	/**
	 * Teste l'egalite avec un objet quelconque.
	 * 
	 * @param that
	 *            Objet quelconque
	 * @return Vrai si l'objet that est egal a l'objet courant, faux sinon
	 */
	public boolean equals(final Object that) {
		return (that != null && that instanceof User && equals((User) that));
	}
}
